home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / viewkit / VCal / TimeSlot.c++ < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  7.1 KB  |  302 lines

  1. /*
  2.  * Copyright (C) 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include <stdio.h>
  18. #include "TimeSlot.h"
  19. #include "Utils.h"
  20. #include "Preferences.h"
  21.  
  22. #include <Xm/Form.h>
  23. #include <Xm/PushB.h>
  24. #include <Xm/Text.h>
  25.  
  26. static Arg args[10];
  27. static int count;
  28.  
  29. static String newTranslations =
  30. "Shift<Key>Return:            activate()\n\
  31. ";
  32.  
  33. void
  34. TimeSlot::text_activate(Widget, XtPointer client_data, XtPointer call_data)
  35. {
  36.   TimeSlot *obj = (TimeSlot *) client_data;
  37.   XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data;
  38.  
  39.   obj->textChanged();
  40.   obj->traversal(cb->event);
  41. }
  42.  
  43. void
  44. TimeSlot::text_focus_lost(Widget, XtPointer client_data, XtPointer)
  45. {
  46.   TimeSlot *obj = (TimeSlot *) client_data;
  47.  
  48.   if (obj->_dirty) {
  49.     obj->textChanged();
  50.   }
  51. }
  52.  
  53. void
  54. TimeSlot::text_modify(Widget, XtPointer client_data, XtPointer)
  55. {
  56.   TimeSlot *obj = (TimeSlot *) client_data;
  57.  
  58.   obj->_dirty = True;
  59. }
  60.  
  61. void
  62. TimeSlot::date_select(Widget, XtPointer client_data, XtPointer)
  63. {
  64.   TimeSlot *obj = (TimeSlot *) client_data;
  65.  
  66.   if (obj->dateSelectEnabled) {
  67.     obj->dateSelect();
  68.   }
  69. }
  70.  
  71. /**********************************************************************/
  72.  
  73. void
  74. TimeSlot::build(Widget parent)
  75. {
  76.   count = 0;
  77.   _baseWidget = XmCreateForm(parent, "timeSlot", args, count);
  78.  
  79.   count = 0;
  80.   XtSetArg(args[count], XmNtopAttachment, XmATTACH_FORM);  count++;
  81.   XtSetArg(args[count], XmNleftAttachment, XmATTACH_FORM);  count++;
  82.   XtSetArg(args[count], XmNbottomAttachment, XmATTACH_FORM);  count++;
  83.   dateButton = XmCreatePushButton(_baseWidget, "dateButton", args, count);
  84.   XtManageChild(dateButton);
  85.   XtAddCallback(dateButton, XmNactivateCallback,
  86.         (XtCallbackProc) TimeSlot::date_select,
  87.         (XtPointer) this);
  88.  
  89.   count = 0;
  90.   XtSetArg(args[count], XmNtopAttachment, XmATTACH_FORM);  count++;
  91.   XtSetArg(args[count], XmNleftAttachment, XmATTACH_WIDGET);  count++;
  92.   XtSetArg(args[count], XmNleftWidget, dateButton);  count++;
  93.   XtSetArg(args[count], XmNrightAttachment, XmATTACH_FORM);  count++;
  94.   text = XmCreateText(_baseWidget, "text", args, count);
  95.   XtManageChild(text);
  96.   XtAddCallback(text, XmNactivateCallback,
  97.         (XtCallbackProc) TimeSlot::text_activate,
  98.         (XtPointer) this);
  99.   XtAddCallback(text, XmNlosingFocusCallback,
  100.         (XtCallbackProc) TimeSlot::text_focus_lost,
  101.         (XtPointer) this);
  102.   XtAddCallback(text, XmNmodifyVerifyCallback,
  103.         (XtCallbackProc) TimeSlot::text_modify,
  104.         (XtPointer) this);
  105.   XtOverrideTranslations(text, XtParseTranslationTable(newTranslations));
  106.  
  107.   afterSwitchScheme();
  108.  
  109.   XtManageChild(_baseWidget);
  110.  
  111.   redisplay();
  112. }
  113.  
  114. void
  115. TimeSlot::setTimeInterval(int s, int l)
  116. {
  117.   if (_start != s || _length != l) {
  118.     _start = s;
  119.     _length = l;
  120.     if (_baseWidget) {
  121.       redisplay();
  122.     }
  123.   }
  124. }
  125.  
  126. void
  127. TimeSlot::setCallback(XtCallbackProc proc, XtPointer client_data)
  128. {
  129.   callback = proc;
  130.   callbackData = client_data;
  131. }
  132.  
  133. char *
  134. TimeSlot::getText()
  135. {
  136.   return XmTextGetString(text);
  137. }
  138.  
  139. void
  140. TimeSlot::setText(char *str)
  141. {
  142.   char *current;
  143.  
  144.   current = XmTextGetString(text);
  145.   if (strcmp(str, current)) {
  146.     XmTextSetString(text, str);
  147.   }
  148.   XtFree(current);
  149.   _dirty = False;
  150. }
  151.  
  152. void
  153. TimeSlot::enableDateSelect()
  154. {
  155.   dateSelectEnabled = True;
  156.   count = 0;
  157.   XtSetArg(args[count], XmNtopShadowColor, dateTop);  count++;
  158.   XtSetArg(args[count], XmNbottomShadowColor, dateBottom);  count++;
  159.   XtSetArg(args[count], XmNbackground, dateBg);  count++;
  160.   XtSetArg(args[count], XmNarmColor, dateArm);  count++;
  161.   XtSetValues(dateButton, args, count);
  162. }
  163.  
  164. void
  165. TimeSlot::disableDateSelect()
  166. {
  167.   dateSelectEnabled = False;
  168.   count = 0;
  169.   XtSetArg(args[count], XmNtopShadowColor, normalBg);  count++;
  170.   XtSetArg(args[count], XmNbottomShadowColor, normalBg);  count++;
  171.   XtSetArg(args[count], XmNbackground, normalBg);  count++;
  172.   XtSetArg(args[count], XmNarmColor, normalBg);  count++;
  173.   XtSetValues(dateButton, args, count);
  174. }
  175.  
  176. void
  177. TimeSlot::afterSwitchScheme()
  178. {
  179.   count = 0;
  180.   XtSetArg(args[count], XmNbackground, &normalBg);  count++;
  181.   XtGetValues(_baseWidget, args, count);
  182.   count = 0;
  183.   XtSetArg(args[count], XmNtopShadowColor, &dateTop);  count++;
  184.   XtSetArg(args[count], XmNbottomShadowColor, &dateBottom);  count++;
  185.   XtSetArg(args[count], XmNbackground, &dateBg);  count++;
  186.   XtSetArg(args[count], XmNarmColor, &dateArm);  count++;
  187.   XtGetValues(dateButton, args, count);
  188.   if (dateSelectEnabled) {
  189.     enableDateSelect();
  190.   } else {
  191.     disableDateSelect();
  192.   }
  193. }
  194.  
  195. void
  196. TimeSlot::setTextFocus()
  197. {
  198.   XmProcessTraversal(text, XmTRAVERSE_CURRENT);
  199. }
  200.  
  201. /**********************************************************************/
  202.  
  203. void
  204. TimeSlot::redisplay()
  205. {
  206.   XmString xs;
  207.   char str[256];
  208.  
  209.   formatTime(_start / 60, _start % 60, thePreferences->clock24(), str);
  210.   xs = XmStringCreateSimple(str);
  211.   count = 0;
  212.   XtSetArg(args[count], XmNlabelString, xs);  count++;
  213.   XtSetValues(dateButton, args, count);
  214.   XmStringFree(xs);
  215. }
  216.  
  217. void
  218. TimeSlot::textChanged()
  219. {
  220.   TimeSlotCallback data;
  221.   char *str;
  222.  
  223.   _dirty = False;
  224.   if (callback) {
  225.     str = getText();
  226.     data.obj = this;
  227.     if (strlen(str)) {
  228.       data.reason = TS_textChanged;
  229.     } else {
  230.       data.reason = TS_textCleared;
  231.     }
  232.     (*callback)(text, callbackData, (XtPointer) &data);
  233.     XtFree(str);
  234.   }
  235. }
  236.  
  237. void
  238. TimeSlot::dateSelect()
  239. {
  240.   TimeSlotCallback data;
  241.  
  242.   if (callback) {
  243.     data.obj = this;
  244.     data.reason = TS_dateSelect;
  245.     (*callback)(text, callbackData, (XtPointer) &data);
  246.   }
  247. }
  248.  
  249. void
  250. TimeSlot::traversal(XEvent *event)
  251. {
  252.   char key;
  253.   TimeSlotCallback data;
  254.  
  255.   if (event->type == KeyPress) {
  256.     XLookupString((XKeyEvent *) event, &key, 1, NULL, NULL);
  257.     if (key == '\r') {
  258.       if (callback) {
  259.     data.obj = this;
  260.     data.reason = (event->xkey.state & ShiftMask) ?
  261.       TS_traverseBackward : TS_traverseForward;
  262.     (*callback)(text, callbackData, (XtPointer) &data);
  263.       }
  264.     }
  265.   }
  266. }
  267.  
  268. /**********************************************************************/
  269.  
  270. TimeSlot::TimeSlot()
  271. : VkComponent()
  272. {
  273.   _start = _length = 0;
  274.   callback = NULL;
  275.   callbackData = NULL;
  276.   _dirty = False;
  277.   _data = NULL;
  278.   dateSelectEnabled = False;
  279. }
  280.  
  281. TimeSlot::~TimeSlot()
  282. {
  283.   XtRemoveCallback(dateButton, XmNactivateCallback,
  284.            (XtCallbackProc) TimeSlot::date_select,
  285.            (XtPointer) this);
  286.   XtRemoveCallback(text, XmNactivateCallback,
  287.            (XtCallbackProc) TimeSlot::text_activate,
  288.            (XtPointer) this);
  289.   XtRemoveCallback(text, XmNlosingFocusCallback,
  290.            (XtCallbackProc) TimeSlot::text_focus_lost,
  291.            (XtPointer) this);
  292.   XtRemoveCallback(text, XmNmodifyVerifyCallback,
  293.            (XtCallbackProc) TimeSlot::text_modify,
  294.            (XtPointer) this);
  295. }
  296.  
  297. const char *
  298. TimeSlot::className()
  299. {
  300.   return "TimeSlot";
  301. }
  302.